package edu.yngsxy.wkstudy.core.security;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import edu.yngsxy.wkstudy.core.model.common.Result;
import edu.yngsxy.wkstudy.core.model.dto.LoginDTO;
import edu.yngsxy.wkstudy.core.model.dto.RegisterDTO;
import edu.yngsxy.wkstudy.core.sys.model.entity.SysUser;
import edu.yngsxy.wkstudy.core.sys.service.SysRoleService;
import edu.yngsxy.wkstudy.core.sys.service.SysUserService;
//import edu.yngsxy.wkstudy.core.wechat.WechatService;
import edu.yngsxy.wkstudy.core.util.WkRedisService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/")
@Tag(name = "认证授权", description = "系统基础模块比如登录、注册等") // 分组标签
public class SaLoginController {
    @Autowired
    private SysUserService sysUserService;
    @PostMapping("login")
    @Operation(summary = "登录", description = "登录接口")
    public Result<Object> login(@RequestBody @Valid LoginDTO loginUser) {

        //第一步：比对前端提交的 账号名称 & 密码 是否正确，比对成功后开始登录
        SysUser obj = sysUserService.login(loginUser);
        if (obj == null) {
            return Result.error("用户名或密码错误");
        }
        // 第二步：根据账号id，进行登录,此处填入的参数应该保持用户表唯一，比如用户id，不可以直接填入整个 User 对象
        // 第1步，先登录上,并传递参数到JWT中，此处可以根据实际情况   连缀写法追加多个
        StpUtil.login(obj.getId(), new SaLoginParameter()
                .setExtra("username", obj.getUsername()));

        // 第2步，获取 Token  相关参数
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        // 获取扩展参数
        //Object n = StpUtil.getExtra("username");
        //System.out.println("登录成功，用户名：" + n);
        // 第3步，返回给前端
        return Result.success("登录成功",tokenInfo.getTokenValue());
    }

    @PostMapping("register")
    @Operation(summary = "注册", description = "")
    public Result<Object> register(@RequestBody @Valid RegisterDTO user) {
        sysUserService.register(user,null);
        return Result.success("注册成功");
    }

    @Autowired
    SysRoleService sysRoleService;
    @Autowired
    WkRedisService redisService;

    /**
     * 刷新角色权限  ---- http://localhost:8081/refresh_rolepermission
     * @return
     */
        @GetMapping("refresh-rolepermission")
        @Operation(summary = "刷新角色权限缓存", description = "")
        public Result<Object> refreshRolePermission() {
            StpInterfaceImpl.refreshRolePermissionList(this.sysRoleService,this.redisService);
            // 返回给前端
            return Result.success("刷新角色权限缓存成功");
        }

    @GetMapping("logout")
    @Operation(summary = "注销", description = "")
    public Result<Object> logout() {
        // 退出登录会清除三个地方的数据：
        // 		1、Redis中保存的 Token 信息
        // 		2、当前请求上下文中保存的 Token 信息
        // 		3、Cookie 中保存的 Token 信息（如果未使用Cookie模式则不会清除）
        StpUtil.logout();

        // StpUtil.logout() 在未登录时也是可以调用成功的，
        // 也就是说，无论客户端有没有登录，执行完 StpUtil.logout() 后，都会处于未登录状态
        System.out.println("当前是否处于登录状态：" + StpUtil.isLogin());

        // 返回给前端
        return Result.success("退出登录成功");
    }

    //    @Autowired
//    private WechatService wechatService;
//
//    /**
//     * 微信小程序登录接口
//     * 通过微信小程序code获取用户信息，实现自动登录或注册---- http://localhost:8080/wechat/mp-login?code=xxxxx
//     * @param code 微信小程序登录凭证,微信小程序登录时获取的临时code
//     * @return 登录结果
//     */
//    @Operation(summary = "微信小程序登录", description = "微信小程序登录")
//    @ApiResponses({
//            @ApiResponse(responseCode = "200", description = "登录成功,返回结果data值为token值"),
//    })
//    @PostMapping("wechat/mp-login")
//    public Result<String> wechatMpLogin(@NotBlank @RequestParam("code") String code) {
//        SysUser user = wechatService.login(code);
//        System.out.println(user.getId()+"-------------");
//        if (user == null) {
//            return Result.error("登录失败");
//        }
//        var loginParam = new SaLoginParameter().setExtra("username", user.getUsername());//返回到客户端的额外参数
//        StpUtil.login(user.getId(), loginParam);// 登录
//        String tokenValue = StpUtil.getTokenInfo().getTokenValue();// 获取token
//        return Result.success("登录成功", tokenValue);// 返回token
//    }

    /**
     * 获取用户信息接口---- http://localhost:8080/userinfo
     * @return 登录用户信息
     */
    @GetMapping("userinfo")
    @Operation(summary = "获取登录用户的信息", description = "获取登录用户的信息")
    public Result<SysUser> userinfo() {
        // 获取当前会话账号id, 如果未登录，则抛出异常：`NotLoginException`
        long userid = StpUtil.getLoginIdAsLong();
        SysUser user = sysUserService.getById(userid);
        if (user == null) {
            return Result.error("用户不存在");
        }
        //todo: 此处需要将用户实体转换为前端需要的对象VO
        return Result.success(user);
    }
}




